<react>react-router实现原理
前端路由解决方案
- 解决思路:1、拦截用户的刷新操作,避免服务端盲目响应、返回不符合预期的资源内容 2、感知 URL 的变化
hash模式
- hash 的改变
1 | // hash 的改变:我们可以通过 location 暴露出来的属性,直接去修改当前 URL 的 hash 值 |
- hash变化监听:通过监听 “hashchange”事件,可以用 JS 来捕捉 hash 值的变化,进而决定我们页面内容是否需要更新
1 | // 监听hash变化,点击浏览器的前进后退会触发 |
history
- history api
- 通过html5 新特性:pushState、replaceState实现
1 | window.history.forward() // 前进到下一页 |
- 监听变化
1 | window.addEventListener('popstate', function(e) { |
- history模式需要在服务端完成 historyApiFallback 配置
react-router设计模式
Monorepo设计
- 与 Monorepo 相对的概念是Multirepo。Multirepo 就是我们常用的开发模式,一个仓库对应一个工程,子团队自行维护
- React Router 使用了 Monorepo 的工程架构,使工程代码对团队中的每一个人都具备透明度
- 通常会使用 Lerna 作为开发管理 Monorepo 的开发工具,它的主要用户包括 Babel、React、umi、React Router 等
Context数据共享
- 使用 Context API 完成数据共享
react-router相关库
- 在 React Router 内部主要依靠 history 库完成,这是由 React Router 自己封装的库,为了实现跨平台运行的特性,内部提供两套基础 history,一套是直接使用浏览器的 History API,用于支持 react-router-dom;另一套是基于内存实现的版本,这是自己做的一个数组,用于支持 react-router-native
- react-router 是没有 UI 层的,react-router-dom = react-router + Dom UI,而 react-router-native = react-router + native UI
react-router关键模块
- Context 容器,分别是 Router 与 MemoryRouter,主要提供上下文消费容器;
- 直接消费者,提供路由匹配功能,分别是 Route、Redirect、Switch;
- 与平台关联的功能组件,分别是 react-router-dom 中的 Link、NavLink 以及 react-router-native 中的 DeepLinking